/**
 * 认证错误处理工具
 * 用于统一处理未授权错误和登录状态检查
 */

/**
 * 判断是否为未授权错误
 * @param {Error} error - 错误对象
 * @returns {boolean} 是否为未授权错误
 */
export function isUnauthorizedError(error) {
  if (!error) return false
  
  const message = error.message || error.toString()
  
  return (
    message.includes('未授权') ||
    message.includes('请先登录') ||
    message.includes('登录已过期') ||
    message.includes('token') ||
    message.includes('401') ||
    message.includes('Unauthorized')
  )
}

/**
 * 检查用户登录状态
 * @returns {boolean} 是否已登录
 */
export function checkLoginStatus() {
  try {
    const token = uni.getStorageSync('token')
    const userInfo = uni.getStorageSync('userInfo')
    
    return !!(token && userInfo)
  } catch (error) {
    console.error('检查登录状态失败:', error)
    return false
  }
}

/**
 * 跳转到登录页面
 * @param {string} redirectUrl - 登录成功后要跳转的页面
 */
export function redirectToLogin(redirectUrl = '') {
  // 清除认证信息
  try {
    uni.removeStorageSync('token')
    uni.removeStorageSync('refreshToken')
    uni.removeStorageSync('userInfo')
  } catch (error) {
    console.error('清除认证信息失败:', error)
  }
  
  // 构建登录页面URL
  let loginUrl = '/pages/auth/login'
  if (redirectUrl) {
    loginUrl += `?redirect=${encodeURIComponent(redirectUrl)}`
  }
  
  // 跳转到登录页面
  uni.reLaunch({
    url: loginUrl
  })
}

/**
 * 处理API调用前的登录检查
 * @param {Function} apiCall - API调用函数
 * @param {Object} options - 选项
 * @param {boolean} options.requireAuth - 是否需要登录
 * @param {string} options.redirectUrl - 未登录时的跳转URL
 * @returns {Promise} API调用结果
 */
export async function handleApiWithAuth(apiCall, options = {}) {
  const { requireAuth = true, redirectUrl = '' } = options
  
  // 如果需要登录但用户未登录，直接跳转登录页面
  if (requireAuth && !checkLoginStatus()) {
    redirectToLogin(redirectUrl)
    throw new Error('未登录，已跳转到登录页面')
  }
  
  try {
    return await apiCall()
  } catch (error) {
    // 如果是未授权错误，跳转到登录页面
    if (isUnauthorizedError(error)) {
      redirectToLogin(redirectUrl)
      throw new Error('登录已过期，已跳转到登录页面')
    }
    
    // 其他错误直接抛出
    throw error
  }
}

/**
 * 在页面中使用的认证检查混入
 */
export const authCheckMixin = {
  methods: {
    // 检查登录状态
    checkAuth() {
      return checkLoginStatus()
    },
    
    // 判断是否为未授权错误
    isUnauthorizedError(error) {
      return isUnauthorizedError(error)
    },
    
    // 跳转到登录页面
    goToLogin(redirectUrl = '') {
      redirectToLogin(redirectUrl)
    },
    
    // 处理需要登录的操作
    async handleAuthRequired(action, redirectUrl = '') {
      if (!this.checkAuth()) {
        uni.showModal({
          title: '需要登录',
          content: '此操作需要登录，是否前往登录？',
          confirmText: '去登录',
          cancelText: '取消',
          success: (res) => {
            if (res.confirm) {
              this.goToLogin(redirectUrl)
            }
          }
        })
        return false
      }
      
      try {
        return await action()
      } catch (error) {
        if (this.isUnauthorizedError(error)) {
          this.goToLogin(redirectUrl)
          return false
        }
        throw error
      }
    }
  }
}

export default {
  isUnauthorizedError,
  checkLoginStatus,
  redirectToLogin,
  handleApiWithAuth,
  authCheckMixin
}